package os

import (
	"fmt"
	"io"
	"log"
	"os"
)

func main_2() {
	wd()

	// createFile()

	// dir()

	// rename()
	// writeFile()

	// readFile()
	openFile()
}

// 获取当前目录
func wd() {
	dir, _ := os.Getwd()
	fmt.Printf("dir: %v\n", dir)

	// 更改当前路径
	// os.Chdir("d:/")
}

// 创建文件
func createFile() {
	f, err := os.Create("test.txt")
	fmt.Printf("f.Name(): %v\n", f.Name())

	if err != nil && !os.IsExist(err) {
		log.Fatal(err)
		fmt.Printf("err.Error(): %v\n", err.Error())
	}
}

//  创建文件夹
func dir() {
	err := os.Mkdir("a", os.ModePerm)
	if err != nil && !os.IsExist(err) {
		log.Fatal(err)
		fmt.Printf("err.Error(): %v\n", err.Error())
	}
}

// 重命名文件名
func rename() {
	err := os.Rename("test.txt", "12.txt")
	if err != nil && !os.IsExist(err) {
		log.Fatal(err)
		fmt.Printf("err.Error(): %v\n", err.Error())
	}
}

// 读取文件
func readFile() {
	b, err := os.ReadFile("12.txt")
	if err != nil && !os.IsExist(err) {
		log.Fatal(err)
		fmt.Printf("err.Error(): %v\n", err.Error())
	}
	fmt.Printf("b: %v\n", string(b[:]))
}

// 写入文件
func openFile() {

	var fileName string = "12.txt"

	// 等同于:  ioutil.ReadFile(fileName)
	// 打开文件
	b, _ := os.OpenFile(fileName,
		os.O_APPEND|os.O_CREATE|os.O_RDWR,
		os.ModeAppend|os.ModePerm,
	)

	// 关闭文件
	defer b.Close()

	// 读取文件
	// ioutil.ReadAll(b).var

	// 声明切片，将文件读取到 buf中
	buf := make([]byte, 10)

	// 循环读取文件内容
	for {
		n, err2 := b.Read(buf)
		if err2 == io.EOF {
			// goto MYLABEL
			break
		}

		// buf[:n]: 读取有效数据
		fmt.Printf("file content: %v\n", string(buf[:n]))
	}

	println("\n")

	var newData string = "\n write file"
	// 直接覆盖
	// copy(b, b2)

	// 等同于: ioutil.WriteFile(fileName, []byte(newData), os.ModePerm)
	count, err := b.WriteString(newData)
	fmt.Printf("count: %v\n", count)
	fmt.Printf("file name: %v\n", string(b.Name()))

	// WriteFile 会覆盖之前内容, 所以在追加内容时先复制之前的内容，再复制到新文件中
	if err != nil && !os.IsExist(err) {
		log.Fatal(err)
		fmt.Printf("err.Error(): %v\n", err.Error())
	}

}

func write() {
	var fileName string = "12.txt"
	// WriteFile 会覆盖之前内容, 所以在追加内容时先复制之前的内容，再复制到新文件中
	err := os.WriteFile(fileName, []byte("ceshi "), os.ModePerm)
	if err != nil && !os.IsExist(err) {
		log.Fatal(err)
		fmt.Printf("err.Error(): %v\n", err.Error())
	}
}
